package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomFlag;
import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomTextLong;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.EntityBinding;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.LookupFeature;
import br.com.telescope.t2.feature.MultiRowInsertFeature;
import br.com.telescope.t2.feature.MultiRowUpdateFeature;
import br.com.telescope.t2.feature.ViewFeature;
import br.com.telescope.util.ObjectUtil;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Instrumentos utilizados nas bancadas.
 * <p>
 * Interface para manutenção de Instrumento utilizado na bancada
 * <P>
 * Telescope origin: ZTEST.CAD_INSTRUMENTO_UTILIZADO
 * <P>
 * Base entity: ZTEST.INSTRUMENTO_UTILIZADO_ENSAIO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadInstrumentoUtilizado extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CAD_INSTRUMENTO_UTILIZADO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Instrumentos utilizados nas bancadas");
    }
    
    protected EntInstrumentoUtilizadoEnsaio base;
    protected EntInstrumentoEnsaio comp;
    protected EntTipoInstrumentoEnsaio tcmp;
    protected EntInstrumentoUtilizadoEnsaio rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomId pIdInstrumentoBase;
    
    // Record items
    private DomId aId;
    private DomId aInstrumentoBaseId;
    private DomId aInstrumentoEnsaioId;
    private DomUpper aCompNome;
    private DomFlag aCompAtivo;
    private DomTextLong aCompDescricao;
    private DomUpper aTcmpNome;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , COMP.NOME as COMP_NOME"
                + " , COMP.ATIVO as COMP_ATIVO"
                + " , COMP.DESCRICAO as COMP_DESCRICAO"
                + " , TCMP.NOME as TCMP_NOME"
                + " , COMP.ID as Z_COMP_ID"
                + " , TCMP.ID as Z_TCMP_ID"
                + " from INSTRUMENTO_UTILIZADO_ENSAIO BASE"
                + " join INSTRUMENTO_ENSAIO COMP on COMP.ID = BASE.INSTRUMENTO_ENSAIO_ID"
                + " join TIPO_INSTRUMENTO_ENSAIO TCMP on TCMP.ID = COMP.TIPO_INSTRUMENTO_ENSAIO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aInstrumentoBaseId = new DomId();
        aInstrumentoBaseId.context(ctx).name("INSTRUMENTO_BASE_ID").label("Instrumento base");
        
        aInstrumentoEnsaioId = new DomId();
        aInstrumentoEnsaioId.context(ctx).name("INSTRUMENTO_ENSAIO_ID").label("Instrumento de medição (componente)");
        
        aCompNome = new DomUpper();
        aCompNome.context(ctx).name("COMP_NOME").label("Sigla (componente)");
        aCompNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from INSTRUMENTO_ENSAIO COMP"
                + " where comp.ativo = 'S' "
                + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S'))", "q"));
        aCompNome.setAutocompleteLength(0);
        
        aCompAtivo = new DomFlag();
        aCompAtivo.context(ctx).name("COMP_ATIVO").label("Componente ativo");
        aCompAtivo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT ATIVO as valor"
                + " , ATIVO as pesquisar"
                + " , ATIVO as descricao"
                + " from INSTRUMENTO_ENSAIO COMP"
                + " where comp.ativo = 'S' "
                + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S'))", "q"));
        aCompAtivo.setAutocompleteLength(0);
        aCompAtivo.setDefaultValue("S");
        
        aCompDescricao = new DomTextLong();
        aCompDescricao.context(ctx).name("COMP_DESCRICAO").label("Descrição (componente)");
        aCompDescricao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT DESCRICAO as valor"
                + " , DESCRICAO as pesquisar"
                + " , DESCRICAO as descricao"
                + " from INSTRUMENTO_ENSAIO COMP"
                + " where comp.ativo = 'S' "
                + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S'))", "q"));
        aCompDescricao.setAutocompleteLength(0);
        
        aTcmpNome = new DomUpper();
        aTcmpNome.context(ctx).name("TCMP_NOME").label("Tipo (componente)");
        aTcmpNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from TIPO_INSTRUMENTO_ENSAIO TCMP"
                + " where tcmp.e_componente = 'S')", "q"));
        aTcmpNome.setAutocompleteLength(0);
        
    }
    
    @Override
    public void initParameters() {
        pIdInstrumentoBase = new DomId(ctx, "ID_INSTRUMENTO_BASE", "Instrumento de ensaio");
        pIdInstrumentoBase.setValue(ctx.getParameter("P_ID_INSTRUMENTO_BASE"));
        pIdInstrumentoBase.setSqlExpression("INSTRUMENTO_BASE_ID");
        if (pIdInstrumentoBase.isNotNull()) {
            aInstrumentoBaseId.setValue(pIdInstrumentoBase.getValue());
        }
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pIdInstrumentoBase);
        }
        return allParameters;
    }
    
    @Override
    public void copyBindParameters() {
        EntInstrumentoUtilizadoEnsaio record = getRecord();
        if (pIdInstrumentoBase.isNotNull()) {
            record.setInstrumentoBaseId(pIdInstrumentoBase.getValue());
        }
    }
    
    @Override
    public void retrieveBindParameters() {
        pIdInstrumentoBase.setValue(getRecord().valueOfInstrumentoBaseId());
    }
    
    @Override
    public void initEntityBindings() {
        EntityBinding binding;
        
        binding = new EntityBinding("ZTEST.TIPO_INSTRUMENTO_ENSAIO", "TCMP", "Z_TCMP_ID", "ZTEST.CAD_TIPO_DISPOSITIVO_ENSAIO.VIEW");
        binding.addFields(aTcmpNome);
        entityBindings.add(binding);
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntInstrumentoUtilizadoEnsaio getRecord() {
        if (base == null) {
            base = new EntInstrumentoUtilizadoEnsaio(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aCompNome.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "COMP_NOME, TCMP_NOME, COMP_ATIVO";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // INSTRUMENTO_ENSAIO_ID
        try {
            if (form.hasFields("COMP_NOME")) {
                query = createQuery()
                        .select("COMP.ID")
                        .from("INSTRUMENTO_ENSAIO", "COMP")
                        .where("comp.ativo = 'S' "
                        + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S')")
                        .filter("COMP.NOME", form.get("COMP_NOME"))
                        ;
                base.setInstrumentoEnsaioId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // INSTRUMENTO_ENSAIO_ID
        try {
            if (form.hasFields("COMP_NOME")) {
                query = createQuery()
                        .select("COMP.ID")
                        .from("INSTRUMENTO_ENSAIO", "COMP")
                        .where("comp.ativo = 'S' "
                        + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S')")
                        .filter("COMP.NOME", form.get("COMP_NOME"))
                        ;
                base.setInstrumentoEnsaioId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aCompNome, "view");
            addField(aTcmpNome, "view");
            addField(aCompAtivo, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VIEW">
    public class FView extends ViewFeature {
        
        @Override
        public void initForm() {
            addField(aCompNome, "view");
            addField(aTcmpNome, "view");
            addField(aCompAtivo, "view");
            addField(aCompDescricao, "view");
        }
        
        {
            setFeatureName("VIEW");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends MultiRowInsertFeature {
        
        @Override
        public void initForm() {
            aCompNome.setOptional(false);
            addField(aCompNome, "rqd");
            aTcmpNome.setEditable(false);
            addField(aTcmpNome, "view");
            aCompAtivo.setEditable(false);
            addField(aCompAtivo, "view");
            aCompDescricao.setEditable(false);
            addField(aCompDescricao, "view");
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
            setRows(10);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends MultiRowUpdateFeature {
        
        @Override
        public void initForm() {
            aCompNome.setOptional(false);
            addField(aCompNome, "rqd");
            aTcmpNome.setEditable(false);
            addField(aTcmpNome, "view");
            aCompAtivo.setEditable(false);
            addField(aCompAtivo, "view");
            aCompDescricao.setEditable(false);
            addField(aCompDescricao, "view");
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
            setRows(10);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aCompNome, "view");
            addField(aTcmpNome, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="COMP_NOME_LOOKUP">
    public class FCompNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aCompNome.setEditable(true);
            addField(aCompNome, "opt");
            aCompAtivo.setEditable(false);
            addField(aCompAtivo, "view");
            aCompDescricao.setEditable(false);
            addField(aCompDescricao, "view");
            aTcmpNome.setEditable(false);
            addField(aTcmpNome, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("COMP.NOME as COMP_NOME")
                    .select("COMP.ATIVO as COMP_ATIVO")
                    .select("COMP.DESCRICAO as COMP_DESCRICAO")
                    .select("TCMP.NOME as TCMP_NOME")
                    .from("INSTRUMENTO_ENSAIO", "COMP")
                    .leftJoin("TIPO_INSTRUMENTO_ENSAIO", "TCMP", "TCMP.ID = COMP.TIPO_INSTRUMENTO_ENSAIO_ID")
                    .where("comp.ativo = 'S' "
                    + " and comp.tipo_instrumento_ensaio_id = (select tcmp.id from tipo_instrumento_ensaio tcmp where tcmp.e_componente = 'S')")
                    ;
        }
        
        {
            setFeatureName("COMP_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FList());
        addFeature(new FView());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FCompNomeLookup());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "LIST";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getInstrumentoBaseId() {
        return aInstrumentoBaseId.getValue();
    }
    
    public void setInstrumentoBaseId(Long value) {
        this.aInstrumentoBaseId.setValue(value);
    }
    
    public Long getInstrumentoEnsaioId() {
        return aInstrumentoEnsaioId.getValue();
    }
    
    public void setInstrumentoEnsaioId(Long value) {
        this.aInstrumentoEnsaioId.setValue(value);
    }
    
    public String getCompNome() {
        return aCompNome.getValue();
    }
    
    public void setCompNome(String value) {
        this.aCompNome.setValue(value);
    }
    
    public String getCompAtivo() {
        return aCompAtivo.getValue();
    }
    
    public void setCompAtivo(String value) {
        this.aCompAtivo.setValue(value);
    }
    
    public String getCompDescricao() {
        return aCompDescricao.getValue();
    }
    
    public void setCompDescricao(String value) {
        this.aCompDescricao.setValue(value);
    }
    
    public String getTcmpNome() {
        return aTcmpNome.getValue();
    }
    
    public void setTcmpNome(String value) {
        this.aTcmpNome.setValue(value);
    }
    
    public Long getParameterIdInstrumentoBase() {
        return pIdInstrumentoBase.getValue();
    }
    
    public void setParameterIdInstrumentoBase(Long value) {
        pIdInstrumentoBase.setValue(value);
        aInstrumentoBaseId.setValue(value);
    }
    // </editor-fold>
    
    
    @Override
    public String getJsServiceFile() {
        return "ui/ztest/cad_instrumento_utilizado.js";
    }
}
